package com.richpay.basejava.base21.part2;

/**
 * 在java中开启子线程有两种方式：继承Thread类和实现Runnable接口，那么这两种方式有什么区别呢？
 * 相同点：都可以开启子线程
 * 不同点：
 * A:继承Thread类，由于java中类的继承是单根继承，因此一旦继承了Thread类就无法在继承其它类了.
 * 而实现Runnable接口后还可以继续继承其它类.
 * B:如果多线程访问共享资源则采用实现Runnable接口的方式是最完美的方式。为什么？
 * 因为如果采用继承Thread类的方式访问共享资源，则在实例化多个对象时就会有多份共享资源，这时的共享资源
 * 已经不是共享资源了，而是每个对象都有一份自己的资源，为了让它成为共享资源，只能将它静态化，但这样一来，虽然
 * 成了共享资源，但共享资源的生命周期被延迟了，不是好的解决方案.那么只剩下实现Runnable接口的方式了.
 */
public class SellTicketsThread {
    public static void main(String[] args) {
        SellTickets sellTickets_beijing = new SellTickets();
        sellTickets_beijing.setName("北京站");
        sellTickets_beijing.start();

        SellTickets sellTickets_shanghai = new SellTickets();
        sellTickets_shanghai.setName("上海站");
        sellTickets_shanghai.start();
    }

    static class SellTickets extends Thread {
        /**
         * 共享资源就是这100张票
         */
        private static int tickets = 100;

        @Override
        public void run() {
            //子线程执行区域:卖票的操作在这里执行
            while (true) {
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在卖" + tickets-- + "张票！");
                } else {
                    break;
                }
            }
        }
    }

}
